
#include "Motor.h"

// 电机PWM控制采用定时器2
void Motor_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
	// 使能定时器2时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

	// PWM输出引脚
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	// A电机方向控制引脚
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	// B电机方向控制引脚
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	// ========================定时器===================================
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // TIM2属于APB1总线

	TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
	TIM_TimeBaseStruct.TIM_Prescaler = 72 - 1; // 预分频72，输入时钟72MHz → 1MHz计数频率
	TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseStruct.TIM_Period = 1000 - 1; // 自动重载值ARR，PWM周期= (ARR+1)/1MHz = 1ms
	TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStruct);

	TIM_OCInitTypeDef TIM_OCStruct;
	TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1（CNT < CCR时输出有效电平）
	TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 有效电平为高

	// 初始占空比50%（CCR=500，ARR=999）
	TIM_OCStruct.TIM_Pulse = 500;
	TIM_OC1Init(TIM2, &TIM_OCStruct); // 初始化通道1

	TIM_OCStruct.TIM_Pulse = 500;
	TIM_OC2Init(TIM2, &TIM_OCStruct); // 初始化通道2


	TIM_Cmd(TIM2, ENABLE); // 启动TIM2

	// PA2 PA3控制电机1方向
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
	GPIO_ResetBits(GPIOA, GPIO_Pin_3);

	// PA4 PA5控制电机2方向
	GPIO_SetBits(GPIOA, GPIO_Pin_4);
	GPIO_ResetBits(GPIOA, GPIO_Pin_5);
	
}

// 设置TIM2通道1（PA0）占空比（范围0~100%）
void Set_PWM1_Duty(int8_t duty)
{
	if(duty>=0)
	{
		// PA2 PA3控制电机1方向
		GPIO_SetBits(GPIOA, GPIO_Pin_2);
		GPIO_ResetBits(GPIOA, GPIO_Pin_3);
	}
	else
	{
		// PA2 PA3控制电机1方向
		GPIO_ResetBits(GPIOA, GPIO_Pin_2);
		GPIO_SetBits(GPIOA, GPIO_Pin_3);
		duty=-duty;
	}
	uint16_t ccr_value = (TIM2->ARR + 1) * duty / 100 - 1;
	TIM_SetCompare1(TIM2, ccr_value); // 更新CCR1寄存器
}

// 设置TIM2通道2（PA1）占空比
void Set_PWM2_Duty(int8_t duty)
{
	if (duty >= 0)
	{
		// PA4 PA5控制电机2方向
		GPIO_SetBits(GPIOA, GPIO_Pin_4);
		GPIO_ResetBits(GPIOA, GPIO_Pin_5);
	}
	else
	{
		// PA4 PA5控制电机2方向
		GPIO_ResetBits(GPIOA, GPIO_Pin_4);
		GPIO_SetBits(GPIOA, GPIO_Pin_5);
		duty=-duty;
	}
	uint16_t ccr_value = (TIM2->ARR + 1) * duty / 100 - 1;
	TIM_SetCompare2(TIM2, ccr_value); // 更新CCR2寄存器
}



